import { allSettledWrapper, sleep } from '$/utils'
import { ElMessage } from 'element-plus'

/**
 * 选择并将文件发送到设备
 *
 * @param {string} deviceId 设备ID
 * @param {Object} options 配置选项
 * @param {FileList} options.files 要发送的文件列表
 * @param {boolean} options.multiSelections 是否允许多选
 * @param {boolean} options.silent 是否静默操作，不显示加载和成功提示
 * @param {string[]} options.extensions 文件扩展名过滤器
 * @param {string} options.selectText 文件选择对话框的提示文本
 * @param {string} options.loadingText 文件发送中的加载文本
 * @param {string} options.successText 文件发送成功的提示文本
 * @returns {Promise<Array>} 返回发送成功的文件列表
 *
 * 此函数用于选择本地文件并将其发送到指定设备如果未提供文件参数，将弹出文件选择对话框
 * 根据multiSelections选项决定是否允许多文件选择在文件发送过程中，如果silent选项为false，将显示加载提示
 * 文件发送完成后，根据结果返回成功发送的文件列表如果发送过程中有文件失败，将抛出错误
 */
export async function selectAndSendFileToDevice(
  deviceId,
  {
    files,
    multiSelections = false,
    silent = false,
    extensions = ['*'],
    selectText = window.t('device.control.file.push.placeholder'),
    loadingText = window.t('device.control.file.push.loading'),
    successText = window.t('device.control.file.push.success.name'),
  } = {},
) {
  // 如果未提供文件，弹出文件选择对话框
  if (!files) {
    try {
      const properties = ['openFile']

      // 根据multiSelections选项决定是否添加多选属性
      if (multiSelections) {
        properties.push('multiSelections')
      }

      files = await window.electron.ipcRenderer.invoke('show-open-dialog', {
        properties,
        filters: [
          {
            name: selectText,
            extensions,
          },
        ],
      })
    }
    catch (error) {
      throw new Error(error.message?.match(/Error: (.*)/)?.[1] || error.message)
    }
  }

  // 如果非静默模式，显示加载提示
  let closeLoading
  if (!silent) {
    closeLoading = ElMessage.loading(`${deviceId}: ${loadingText}`).close
  }

  // 初始化成功和失败的文件列表
  const successFiles = []
  const failFiles = []

  // 并行处理每个文件，尝试发送到设备
  await allSettledWrapper(files, async (item) => {
    const ret = await window.adbkit.push(deviceId, item).catch((e) => {
      console.warn(e?.message)
      failFiles.push(`${deviceId}-${item}`)
    })

    // 根据发送结果更新成功文件列表
    if (ret) {
      successFiles.push(ret)
    }
  })

  // 等待一段时间以确保所有操作完成
  await sleep()

  // 如果有文件发送失败，关闭加载提示并抛出错误
  if (failFiles.length) {
    closeLoading?.()
    throw new Error(`Push file failed: ${failFiles.join(',')}`)
  }

  // 关闭加载提示
  closeLoading?.()

  // 如果非静默模式，显示成功提示
  if (!silent) {
    ElMessage.success({ message: successText, grouping: true })
  }

  // 返回发送成功的文件列表
  return successFiles
}

/**
 * 打开浮动控制窗口
 *
 * @param {Object} deviceInfo 设备信息
 * @returns {boolean} 返回是否成功打开浮动控制窗口
 *
 * 此函数用于打开设备的浮动控制窗口只有当浮动控制窗口已启用时才会尝试打开
 */
export function openFloatControl(deviceInfo) {
  const floatControl = window.appStore.get('common.floatControl')

  // 检查是否已启用浮动控制窗口
  if (!floatControl) {
    return false
  }

  // 调用Electron的IPCRenderer以打开控制窗口
  window.electron.ipcRenderer.invoke('open-control-window', deviceInfo)
}
